package com.zp.self.module.level_4_算法练习.数据结构.String;

/**
 * @author By ZengPeng
 */
public class 力扣_541_反转字符串II {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_541_反转字符串II().reverseStr("abcdefg",2));
        System.out.println(new 力扣_541_反转字符串II().reverseStr("abcdefg",12));
        System.out.println(new 力扣_541_反转字符串II().reverseStr("abcd",2));
        System.out.println(new 力扣_541_反转字符串II().reverseStr("abcd",1));
        System.out.println(new 力扣_541_反转字符串II().reverseStr("a",10));
    }

    /**
    题目：给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
     如果剩余字符少于 k 个，则将剩余字符全部反转。
     如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。

     示例 1：
     输入：s = "abcdefg", k = 2
     输出："bacdfeg"

     示例 2：
     输入：s = "abcd", k = 2
     输出："bacd"

    分析：【P ♥♥】
       1.直接循环，每次找到要交换的下标起始点

    边界值 & 注意点：
       1.
     **/
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int start=0,size=s.length();
        while (start<size){
            int end =Math.min(size, start+k);//这里注意别越界
            fanzhuan(chars,start,end-1);//这里记得减1
            start=end+k;
        }
        return String.valueOf(chars);
    }

    private void fanzhuan(char[] chars, int start, int end) {
        char mid;
        while (start<end){
            mid = chars[start];
            chars[start++] = chars[end];
            chars[end--] = mid;
        }
    }
}
